package curl

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"
)

// Get 发送GET请求
// url: 请求地址
// params: 请求参数
// result: 接收响应的对象
func Get(requestURL string, params map[string]string, result interface{}) error {
	// 构建带参数的URL
	if len(params) > 0 {
		queryParts := []string{}
		for key, value := range params {
			// 只添加非空的键值对
			if key != "" {
				queryParts = append(queryParts, fmt.Sprintf("%s=%s", key, value))
			}
		}
		
		// 如果有查询参数，则添加到URL中
		if len(queryParts) > 0 {
			queryStr := strings.Join(queryParts, "&")
			if queryStr != "" {
				if strings.Contains(requestURL, "?") {
					requestURL += "&" + queryStr
				} else {
					requestURL += "?" + queryStr
				}
			}
		}
	}

	// 发送GET请求
	resp, err := http.Get(requestURL)
	if err != nil {
		return fmt.Errorf("发送GET请求失败: %w", err)
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("读取响应体失败: %w", err)
	}

	// 检查HTTP状态码
	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("HTTP请求失败，状态码: %d, 响应体: %s", resp.StatusCode, string(body))
	}

	// 如果result为nil，则不解析响应
	if result == nil {
		return nil
	}

	// 解析JSON响应
	if err := json.Unmarshal(body, result); err != nil {
		return fmt.Errorf("解析JSON响应失败: %w", err)
	}

	return nil
}

// Post 发送POST请求
// url: 请求地址
// params: 请求参数
// result: 接收响应的对象
func Post(requestURL string, params interface{}, result interface{}) error {
	var req *http.Request
	var err error

	// 处理参数
	if params == nil {
		// 如果参数为nil，创建一个空的请求体
		req, err = http.NewRequest("POST", requestURL, nil)
	} else {
		// 将参数转换为JSON
		jsonData, err := json.Marshal(params)
		if err != nil {
			return fmt.Errorf("序列化请求参数失败: %w", err)
		}

		// 创建POST请求
		req, err = http.NewRequest("POST", requestURL, bytes.NewBuffer(jsonData))
	}

	if err != nil {
		return fmt.Errorf("创建POST请求失败: %w", err)
	}

	// 设置Content-Type
	req.Header.Set("Content-Type", "application/json")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("发送POST请求失败: %w", err)
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("读取响应体失败: %w", err)
	}

	// 检查HTTP状态码
	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("HTTP请求失败，状态码: %d, 响应体: %s", resp.StatusCode, string(body))
	}

	// 如果result为nil，则不解析响应
	if result == nil {
		return nil
	}

	// 解析JSON响应
	if err := json.Unmarshal(body, result); err != nil {
		return fmt.Errorf("解析JSON响应失败: %w", err)
	}

	return nil
}